package Negocio;

import java.util.Date;
import java.util.Vector;

import Persistencia.AdministradorPersistenciaLinea;


public abstract class Linea {
	
	private Plan plan;
	private String numero;
	private Usuario usuario;
	private Date fechaContrato;
	private Vector <Consumo> consumos;
	private static int id = 0;
	
	
	//Inicio PR - Constructor
	
	public Linea(Plan plan, String numero, Usuario usuario, Date fechaContrato) {
		super();
		this.plan = plan;
		this.numero = numero;
		this.usuario = usuario;
		this.fechaContrato = fechaContrato;
		consumos = new Vector<Consumo>();

	}
	
	
	public Linea(Plan plan, String numero, Usuario usuario, Date fechaContrato, Vector <Consumo> consumos) {
		super();
		this.plan = plan;
		this.numero = numero;
		this.usuario = usuario;
		this.fechaContrato = fechaContrato;
		this.consumos = consumos;

	}
	//Fin PR - Constructor
	
	public Linea() {
		consumos = new Vector<Consumo>();
	}

	//Inicio PR - Registrar Consumo
	public void registrarConsumo(String nroLinea, Servicio servicio, Date fyh, int cantidad){
		if (plan.tenesServicio(servicio.getNombre())){
			float consumido = contabilizarConsumos(servicio);
			float ul = plan.unidadesLibres(servicio.getNombre());
			double costoAdicional=0;
			
			if (consumido > ul){
				costoAdicional=plan.costoAdicional(servicio.getNombre());
				Consumo nuevoConsumo=new Consumo(fyh, cantidad, nroLinea, servicio, costoAdicional);
				consumos.add(nuevoConsumo);
				AdministradorPersistenciaLinea.getInstancia().insertConsumo(nroLinea, nuevoConsumo, id++);
			}
		}			
	}
	//Fin PR - Registrar Consumo
	
	//Inicio PR - Obtiene el total ya consumido del servicio
	private float contabilizarConsumos(Servicio servicio) {
		// TODO Auto-generated method stub
		float totalConsumido=0;
		for(int i=0;i<consumos.size();i++){
			if (consumos.elementAt(i).sosEsteServicio(servicio.getNombre()) && !consumos.elementAt(i).isLiquidado())
				totalConsumido=totalConsumido+consumos.elementAt(i).getCantidadConsumida();
		}		
		return totalConsumido;		
	}
	//Fin PR - Contabilizar Consumos
	
	
	
	
	public String getNumero() {
		return numero;
	}


	public void setNumero(String numero) {
		this.numero = numero;
	}


	public Date getFechaContrato() {
		return fechaContrato;
	}


	public void setFechaContrato(Date fechaContrato) {
		this.fechaContrato = fechaContrato;
	}
	

	public Factura liquidarLinea(Date fechaDesde, Date fechaHasta){

		Factura f = null;
		int i, j = 0;
		String serv,s;
		int canttot = 0;
		float pretot = 0;
		
		if (this.plan.calcularCostoBase()!= 0)
			this.OrdenarConsumos();
			f = new Factura(fechaHasta);
			f.nuevoItemFactura(1, this.plan.calcularCostoBase(),"Cargo Fijo");
			i = consumos.size();
			for (j = 0; j < i; j++){
				serv = consumos.get(i).getNombreServicio();
				if(!consumos.get(j).getEstado() && 
					(consumos.get(j).getFechaConsumo().compareTo(fechaDesde)>= 0) &&
						(consumos.get(j).getFechaConsumo().compareTo(fechaHasta) < 0)){
					
					pretot = (float) (pretot + consumos.get(j).getPrecioServicio());
					canttot = canttot + consumos.get(j).getCantidadConsumida();
					if((j + 1) < i){
						s = consumos.get(j+1).getNombreServicio();
						if(s.compareTo(serv)!= 0){
							f.nuevoItemFactura(canttot, pretot, serv);
							pretot = 0;
							canttot = 0;
						}
					}
					else
						f.nuevoItemFactura(canttot, pretot, serv);
				}
			}					
		return f;
	}
	
	private void OrdenarConsumos(){
		String uno, dos;
		Consumo c;
		for(int i=0; i< consumos.size()-1; i++)
			for(int j = i + 1; j < consumos.size(); j++){
				 uno = consumos.get(i).getNombreServicio();
				 dos = consumos.get(j).getNombreServicio();
				 if (uno.compareTo(dos) > 0){
					 c = consumos.get(i);
					 consumos.set(i, consumos.get(j));
					 consumos.set(j, c);
				 }
			}
	}

	public Plan getPlan(){
		return plan;
	}
	public int TieneConsumos() {
		// TODO Auto-generated method stub
		return consumos.size();
	}
	public Vector<Consumo> getConsumos(){
		return consumos;
	}

	public Usuario getUsuario() {
		return usuario;
	}
	
	public abstract boolean isTitular();
	
	public LineaView getView() {
		// TODO Auto-generated method stub
		
		java.util.Date date = new java.util.Date(); 
		java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("dd/MM/yyyy");
		String fecha = sdf.format(this.getFechaContrato());
	    
		return new LineaView(this.getNumero(), fecha,Integer.toString(this.getPlan().getNumero()),this.getUsuario().getDni());
	}
	
}
